﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace intelliEssay.Core
{
    /// <summary>
    /// The intelliEssay checker interface
    /// </summary>
    /// <remarks>
    /// All intelliEssay-compliant checker must inherit this interface in order to run the task.
    /// </remarks>
    public interface IEssayChecker
    {
        /// <summary>
        /// This method is called whenever a checker is started
        /// </summary>
        /// <remarks>
        /// 注意：intelliEssay不保证使用任何一种线程模型运行，但是,intelliEssay将至少拥有一条GUI线程以及一条
        /// 检查线程。但是，在一些性能优秀的计算机下,intelliEssay使用n(n小于处理器数目)条线程处理n个任务，每个任务
        /// 使用m条线程进行m个检查(m*n的值小于处理器个数)。这些检查不可相互依赖，因为检查顺序是不确定的。
        /// </remarks>
        /// <param name="task">the document associated task</param>
        void Run(Task task);
        /// <summary>
        /// This method is used when an abort command is issued during check
        /// </summary>
        /// <remarks>
        /// When a checker has already stopped checking, calling this method will be useless.
        /// <para>However, be sure to take the following two ways to implement this method.</para>
        /// <para>  *使用一个位来表示是否需要停止检查，在检查的方法中，每隔一段检查这个标志位以确定是否终止检查</para>
        /// <para>  *使用一条线程，当这个方法被调用时关闭这条线程</para>
        /// <para>这两个方法均有优劣，当使用第一种方法时，深循环中可能需要较长时间该方法才能返回；</para>
        /// <para>使用线程，代价可能较大，但是响应在一些情况下较好</para>
        /// </remarks>
        /// <param name="task">the document associated task</param>
        void Cancel(Task task);
        /// <summary>
        /// Description of the checker
        /// </summary>
        string GetDescription(string cultureInfo);
        /// <summary>
        /// Name of the checker
        /// </summary>
        string GetName(string cultureInfo);
    }
}
